<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 创建对象的方式 
        // 1. 字面量
        var obj = {
            name: 'zs',
            age: 18,
            say: function () {
                console.log('hello');
            }
        }

        obj.name
        obj.country = 'china'
        obj.say()
        obj.fish = function () {
            console.log('fish');
        }

        var obj2 = {
            name: 'zs2',
            age: 18,
            say: function () {
                console.log('hello world');
            }
        }
        //2. 内置构造函数

        var obj3 = new Object();
        obj3.name = '高启盛';
        obj3.age = 18;
        obj3.run = function () {
            console.log(this.name+'告诉老默,我想吃鱼了');
        }

        var obj4 = new Object();
        obj4.name = '高启强';
        obj4.age = 28;
        obj4.run = function () {
            console.log(this.name+'告诉老默,我也想吃鱼了');
        }


        obj4.name
        obj4.run()


        //3. 工厂函数


        function createObj(name1,age1,city1){
            var obj = new Object();
            obj.name = name1
            obj.age = age1
            obj.city = city1
            obj.run = function(){
                    return this.name+'你要在'+this.age+'岁的时候取'+this.city+'的姑娘'
                };
            return obj;
        }

        var p1 = createObj('李友田',66,'莽村1');
        var p2 = createObj('李宏伟',36,'莽村2');

        // console.log(p1.run())
        // console.log(p2.run())
        //4.构造函数
        function MyObj(name,age){
            this.name = name
            this.age = age
            this.run = function(){
                return this.name+'在'+this.age+'选择了安逸'
            }

            //没有return 

        }

        // var n1 = new MyObj('YUHANG',18);
        // var n2 = new MyObj('YUHANG1',18);
        // var n3 = new MyObj('YUHANG2',18);
        // var n4 = new MyObj('YUHANG3',18);

        // console.log(n1.run())
        // console.log(n2.run())
        // console.log(n3.run())
        // console.log(n4.run())


        // 构造函数和普通函数的区别?

        // 构造函数起始就是个普通的函数 略有区别 

        // 1. 标识符的名字   第一个字母必须大写 
        //2 .不能写return  
            // return 基本数据类型  写不写没啥用 
            // return 复杂数据类型  构造函数写不写没啥用 

        // 3. 必须和new 一起用 
        // 只有和new 一起用才能 自动的创建对象和自动的返回对象



        // 4. 构造函数中的this  
        // this 指向 的就是自动创建的对象 



        // 遍历对象 
        var n5 = new MyObj('YUHANG',18);
        // for ... in 
        // for(let k in n5){
        //     console.log(k);
        // }

        //for ... of 
        // for(let k of n5){
        //     console.log(k);
        // }
        // for of 不能遍历对象

        var test = [1,11,21,31,51];


        // for(let k in test){
        //     console.log(k); // for in k 是索引
        // }
        // for(let k of test){
        //     console.log(k); // for of k得到的是 元素本身 
        // }

        // for of 不能遍历对象  


        // 可以遍历数组  set map 

        var newset = new Set([2,22,222,2222]);
        for(let k of newset){
            console.log(k); // for of k得到的是 元素本身 
        }

        var newmap = new Map([['name','张三'],['age',18],['height','181cm']]);
        for(let k of newmap){
            console.log(k); // for of k得到的是 元素本身 
        }


        // for  in  for of 的区别 
        // for in 能遍历对象  

        // for of 不能遍历对象 
        // for of 只能遍历 数组 set  map
        
    </script>
</body>
</html>